Scripting (continuación)
Procesamiento Varias acciones en Godot son activadas por las llamadas de retorno o las funciones virtuales, por lo que no hay necesidad de escribir código que se ejecuta todo el tiempo. Además, se puede hacer mucho con los animation players. Sin embargo, sigue siendo un caso muy común tener un proceso de script en cada fotograma. Existen dos tipos de procesamiento: *Procesamiento inactivo. *Procesamiento físico. El proceso inactivo se activa automáticamente cuando el método Nodo._process () se encuentra en un script. Se puede desactivar (y volver a activar) con la función Node.set_process (). Este método se llama cada fotograma dibujado, por lo que depende totalmente de los fotogramas por segundo (FPS) de la aplicación: GDScript= func _process(delta): # do something... El parámetro delta describe el tiempo transcurrido (en segundos, con coma flotante o decimales) desde la llamada anterior a _process(). Este parámetro delta se puede utilizar para asegurarse de que las cosas siempre llevan el mismo tiempo, independientemente del hardware en el que se esté ejecutando el juego. Por ejemplo, el movimiento se multiplica a menudo con el delta time para que este sea constante e independiente de la velocidad de cuadro. El procesamiento de la física ('''_physics_process()')'' es similar, pero debe ser utilizado para todos los procesos que deben ocurrir antes de cada paso de la física, por ejemplo, para mover un personaje. Se ejecuta siempre antes de un paso físico y se llama a intervalos de tiempo fijos, 60 veces por segundo por defecto. Modifique el valor en Ajustes del proyecto. La función _process() no está sincronizada con la física. Su velocidad de cuadro no es constante y depende de la optimización del hardware y del juego. Su ejecución se realiza después del paso de física en juegos de un solo hilo. Una forma sencilla de probarlo es crear una escena con un único nodo Label, con el siguiente script: GDScript= extends Label var accum=0 func _process(delta): accum += delta text = str(accum) # text is a built-in label property Que mostrará un contador incrementando cada fotograma. Grupos Se pueden añadir nodos a los grupos (tantos como se desee por nodo). Esta es una función simple pero útil para organizar escenas grandes. Hay dos maneras de hacer esto: La primera es desde la interfaz de usuario, desde la pestaña Grupos situada en el panel Nodo: La segunda forma es hacerlo por código. Un ejemplo útil sería etiquetar escenas como "enemies" (enemigos). GDScript= func _ready(): add_to_group("enemies") De esta manera, si el jugador es descubierto entrando a escondidas en la base secreta, todos los enemigos pueden ser notificados haciendo sonar la alarma, para ello vamos a usar SceneTree.call_group(): GDScript= func _on_discovered(): # this is a fictional function get_tree().call_group("enemies", "player_was_discovered") El código anterior llama a la función "player_was_discovered" de cada miembro del grupo "enemies" (enemigos). Opcionalmente, es posible obtener la lista completa de nodos "enemies" (enemigos) llamando a SceneTree.get_nodes_in_group(): GDScript= var enemies = get_tree().get_nodes_in_group("enemies") Más adelante se añadirá más información sobre SceneTree. Notificaciones Godot tiene un sistema de notificaciones. Por lo general, esto no es necesario para la programación de scripts, ya que su nivel es demasiado bajo y se proporcionan funciones virtuales para la mayoría de ellos, aunque es bueno saber que existen. Simplemente agrega una función Object._notification() en su script: GDScript= func _notification(what): if (what NOTIFICATION_READY): print("This is the same as overriding _ready()...") elif (what NOTIFICATION_PROCESS): var delta = get_process_time() print("This is the same as overriding _process()...") La documentación de cada clase en la Referencia de clases muestra las notificaciones que puede recibir. Sin embargo, para la mayoría de los casos GDScript proporciona funciones sobreescribibles (override) más simples. Funciones sobreescribibles (override) Los nodos proporcionan muchas funciones sobreescribibles útiles, que se describen a continuación: GDScript= func _enter_tree(): # Cuando el nodo entra en el Scene Tree (Árbol de escena) # se activa y esta función se llama. # Los nodos hijos todavía no han entrado a la escena activa. # En general, es mejor usar _ready() para la mayoría de los casos. pass func _ready(): # Esta función se llama después del el Scene Tree, # pero asegura que todos los nodos hijos también han entrado # en el Scene Tree (Árbol de escena), y se volvió activo. pass func _exit_tree(): # Cuando el nodo sale del Scene Tree, esta función se llama. # En este punto los nodos hijos han salido del Scene Tree. # y todo se volvió inactivo. pass func _process(delta): # Esta función se llama cada fotograma. pass func _physics_process(delta): # Esto se llama todo frame de física. pass func _paused(): # Llamado cuando el juego está en pausa. # Después de esta llamada, el nodo no recibirá más llamadas de proceso. pass func _unpaused(): # Se llama cuando el juego se reanuda. pass Como se mencionó anteriormente, es mejor usar estas funciones. Creación de nodos Para crear un nodo desde el código, llama al método .new(), igual que para cualquier otro tipo de datos basado en clases, por ejemplo: GDScript= var s func _ready(): s = Sprite.new() # ¡Crea un nuevo sprite! add_child(s) # añadirlo como hijo de este nodo Para borrar un nodo, ya sea dentro o fuera de la escena, se debe utilizar free(): GDScript= func _someaction(): s.free() # elimina inmediatamente el nodo de la escena y lo libera Cuando un nodo se libera, también libera todos sus nodos hijos. Debido a esto, borrar nodos manualmente es mucho más sencillo de lo que parece. Simplemente libera el nodo base y todo lo demás en el subárbol desaparecerá con él. Sin embargo, puede suceder muy a menudo que queramos borrar un nodo que está actualmente "bloqueado", porque está emitiendo una señal o llamando a una función; esto provocará la caída del juego. Ejecutar Godot en el depurador a menudo detectará estos casos y te lo advertirá. La forma más segura de eliminar un nodo es usando Node.queue_free(). Esto borrará el nodo de forma segura mientras está inactivo. GDScript= func _someaction(): s.queue_free() # Eliminar el nodo y borrarlo mientras no ocurre nada. Instanciando escenas Instanciar una escena desde código es bastante fácil y se hace en dos pasos. La primera es cargar la escena desde el disco. GDScript= var scene = load("res://myscene.tscn") # se cargará cuando el script sea instanciado A veces la precarga puede ser más conveniente, como ocurre a la hora del análisis. GDScript= var scene = preload("res://myscene.tscn") # se cargará al analizar el script Pero "scene" no es todavía un nodo que contenga nodos hijos. Está empaquetado en un recurso especial llamado PackedScene. Para crear el nodo real, debe llamarse la función PackedScene.instance(). Esto devolverá el árbol de nodos que se pueden añadir a la escena activa: GDScript= var node = scene.instance() add_child(node) La ventaja de este proceso de dos pasos es que una escena empaquetada puede mantenerse cargada y lista para usar, por lo que se puede utilizar para crear tantas instancias como se desee. Esto es especialmente útil para la rápida aparición de varios enemigos, balas, etc., en la escena activa. __FORZARTDC__ Categoría:Paso a paso Categoría:Primeros pasos